Method %s::%s cannot be #[\NoDiscard]
Description
The #[\NoDiscard] attribute marks a function, method or closure so that the engine emits a warning whenever a caller ignores its return value. Certain magic methods, such as __construct, __destruct, __clone and __wakeup, are always invoked for their side effect and never return a usable value to the caller (new returns the object itself, not the constructor’s return value), so attaching #[\NoDiscard] to them is meaningless and rejected at compile time.
Example
<?php
class X {
#[\NoDiscard]
public function __construct() {}
}
new X();
?>
Literal Examples
- Method X::__construct cannot be #[\NoDiscard]
Alternatives
- Remove the
#[\NoDiscard]attribute from the magic method. - If a discardable-value warning is needed, move the logic to a regular, non-magic method and mark that one instead.
Related error messages
- a-void-%s-does-not-return-a-value
- a-never-returning-%s-does-not-return-a-value
- method-%s::%s-cannot-be-#[–nodiscard]-error_type
Changed Behavior
This error may appear following an evolution in behavior, in previous versions. See